/**
 * @Title: PrivilegeServiceImpl.java
 * @Package com.leesche.zcsp.node.web.service.privilege.impl
 * @Description:()
 * @author dennies yang
 * @date 2016年10月14日 上午11:34:51
 * @version V1.0
 */
package com.leesche.zcsp.node.web.service.privilege.impl;

import com.leesche.zcsp.node.app.v1.timer.TokenCacheTimer;
import com.leesche.zcsp.node.utils.web.SessionManager;
import com.leesche.zcsp.node.web.constants.Constants;
import com.leesche.zcsp.node.web.service.SysModuleService;
import com.leesche.zcsp.node.web.service.impl.data.read.QuerySysModuleCondition;
import com.leesche.zcsp.node.web.service.impl.data.read.SysModuleDto;
import com.leesche.zcsp.node.web.service.privilege.PrivilegeService;
import com.leesche.zcsp.node.web.vo.Principal;
import com.leesche.zcsp.node.web.vo.Privilege;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.instrument.classloading.LoadTimeWeaver;
import org.springframework.stereotype.Service;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author dennies yang
 * @version V1.0
 * @Title: PrivilegeServiceImpl.java
 * @Package com.leesche.zcsp.node.web.service.privilege.impl
 * @Description:()
 * @date 2016年10月14日 上午11:34:51
 */
@Service
public class PrivilegeServiceImpl implements PrivilegeService {
	
	// 根据springmvc 路径匹配规则
	private static AntPathMatcher antPathMatcher = new AntPathMatcher();

	// APP权限集合
	public static Map<Long, Privilege> appPrivileges = new HashMap<Long, Privilege>();
	// 微信权限集合
	public static Map<Long, Privilege> wechatPrivileges = new HashMap<Long, Privilege>();
	// WEB权限集合
	public static Map<Long, Privilege> webPrivileges = new HashMap<Long, Privilege>();
	// 操作权限集合
	public static Map<Long, Privilege> operationPrivileges = new HashMap<Long, Privilege>();

	//APPtoken 当前集合
	private static Map<String,Principal> tokens=new HashMap<String, Principal>();


	@Autowired
	protected SysModuleService sysModuleService;

	@Override
	public void refreshPrivilege() {
		List<SysModuleDto> moduleList = sysModuleService
				.findAllSysModules(new QuerySysModuleCondition());
		for (SysModuleDto sysModuleDto : moduleList) {
			if (sysModuleDto.getNtype() == Constants.MODULE_TYPE_WEB) {
				this.addWebPrivilege(sysModuleDto);
			} else if (sysModuleDto.getNtype() == Constants.MODULE_TYPE_WECHAT) {
				this.addWechatPrivilege(sysModuleDto);
			} else if (sysModuleDto.getNtype() == Constants.MODULE_TYPE_APP) {
				this.addAppPrivilege(sysModuleDto);
			} else if (sysModuleDto.getNtype() == Constants.MODULE_TYPE_OPERATION) {
				this.addOperationPrivilege(sysModuleDto);
			}
		}

	}

	@Override
	public void addWebPrivilege(SysModuleDto sysModule) {
		if (sysModule != null
				&& !webPrivileges.containsKey(sysModule.getModuleid())) {
			webPrivileges.put(
					sysModule.getModuleid(),
					new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule
							.getNamecn(), sysModule.getUrl(), sysModule
							.getAttribute()));

		}
	}

	@Override
	public void addWechatPrivilege(SysModuleDto sysModule) {
		if (sysModule != null
				&& !wechatPrivileges.containsKey(sysModule.getModuleid())) {
			wechatPrivileges.put(
					sysModule.getModuleid(),
					new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule
							.getNamecn(), sysModule.getUrl(), sysModule
							.getAttribute()));
		}

	}

	@Override
	public void addAppPrivilege(SysModuleDto sysModule) {
		if (sysModule != null
				&& !appPrivileges.containsKey(sysModule.getModuleid())) {
			appPrivileges.put(
					sysModule.getModuleid(),
					new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule
							.getNamecn(), sysModule.getUrl(), sysModule
							.getAttribute()));
		}
	}

	@Override
	public void addOperationPrivilege(SysModuleDto sysModule) {
		if (sysModule != null
				&& !operationPrivileges.containsKey(sysModule.getModuleid())) {
			operationPrivileges.put(
					sysModule.getModuleid(),
					new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule
							.getNamecn(), sysModule.getUrl(), sysModule
							.getAttribute()));
		}
	}

	@Override
	public void updateOperationPrivilege(SysModuleDto sysModule) {
		this.deleteOperationPrivilege(sysModule.getModuleid());
		operationPrivileges.put(sysModule.getModuleid(),
				new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule.getNamecn(),
						sysModule.getUrl(), sysModule.getAttribute()));
	}

	@Override
	public void updateWebPrivilege(SysModuleDto sysModule) {
		this.deleteWebPrivilege(sysModule.getModuleid());
		webPrivileges.put(sysModule.getModuleid(),
				new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule.getNamecn(),
						sysModule.getUrl(), sysModule.getAttribute()));

	}

	@Override
	public void updateWechatPrivilege(SysModuleDto sysModule) {
		this.deleteWechatPrivilege(sysModule.getModuleid());
		wechatPrivileges.put(sysModule.getModuleid(),
				new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule.getNamecn(),
						sysModule.getUrl(), sysModule.getAttribute()));

	}

	@Override
	public void updateAppPrivilege(SysModuleDto sysModule) {
		this.deleteAppPrivilege(sysModule.getModuleid());
		appPrivileges.put(sysModule.getModuleid(),
				new Privilege(sysModule.getModuleid(),sysModule.getPmoduleid(), sysModule.getNamecn(),
						sysModule.getUrl(), sysModule.getAttribute()));

	}

	@Override
	public void deleteOperationPrivilege(Long moduleId) {
		if (operationPrivileges.containsKey(moduleId)) {
			operationPrivileges.remove(moduleId);
		}
	}

	@Override
	public void deleteWebPrivilege(Long moduleId) {
		if (webPrivileges.containsKey(moduleId)) {
			webPrivileges.remove(moduleId);
		}

	}

	@Override
	public void deleteWechatPrivilege(Long moduleId) {
		if (wechatPrivileges.containsKey(moduleId)) {
			wechatPrivileges.remove(moduleId);
		}
	}

	@Override
	public void deleteAppPrivilege(Long moduleId) {
		if (appPrivileges.containsKey(moduleId)) {
			appPrivileges.remove(moduleId);
		}
	}

	@Override
	public boolean isUserOperationPrivilege(String uri) {
		Principal principal = this.getCurrentPrincipal();
		if (principal != null) {
			// 获取用户的所有权限
			List<Long> userModuleid = principal.getModuleIds();
			for (Long moduleid : userModuleid) {
				// 根据用户的权限获取系统中对应的权限
				Privilege privilege = operationPrivileges.get(moduleid);
				// 匹配当前当前请求的uri是否符合当前系统权限的规则,不符合进入下一次匹配。符合则返回1;
				// 当循环结束仍未符合系统规则，则表示当前用户没有权限
				if (privilege != null && antPathMatcher.match(privilege.getUrl(), uri)) {
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public boolean isUserWebPrivilege(String uri) {
		Principal principal = this.getCurrentPrincipal();
		if (principal != null) {
			// 获取用户的所有权限
			List<Long> userModuleid = principal.getModuleIds();
			for (Long moduleid : userModuleid) {
				// 根据用户的权限获取系统中对应的权限
				Privilege privilege = webPrivileges.get(moduleid);
				// 匹配当前当前请求的uri是否符合当前系统权限的规则,不符合进入下一次匹配。符合则返回1;
				// 当循环结束仍未符合系统规则，则表示当前用户没有权限
				if (privilege != null &&  antPathMatcher.match(privilege.getUrl(), uri)) {
					return true;
				}
			}
		}
		return false;

		/*
		 * for (Map.Entry<Long, Privilege> entry : webPrivileges.entrySet()) {
		 * if (antPathMatcher.match(entry.getValue().getUrl(), uri)) { return
		 * entry.getKey(); } } return Long.valueOf(-1);
		 */
	}

	@Override
	public boolean isUserWechatPrivilege(String uri) {
		Principal principal = this.getCurrentPrincipal();
		if (principal != null) {
			// 获取用户的所有权限
			List<Long> userModuleid = principal.getModuleIds();
			for (Long moduleid : userModuleid) {
				// 根据用户的权限获取系统中对应的权限
				Privilege privilege = wechatPrivileges.get(moduleid);
				// 匹配当前当前请求的uri是否符合当前系统权限的规则,不符合进入下一次匹配。符合则返回1;
				// 当循环结束仍未符合系统规则，则表示当前用户没有权限
				if (privilege != null && antPathMatcher.match(privilege.getUrl(), uri)) {
					return true;
				}
			}
		}
		return false;

		/*
		 * for (Map.Entry<Long, Privilege> entry : wechatPrivileges.entrySet())
		 * { if (antPathMatcher.match(entry.getValue().getUrl(), uri)) { return
		 * entry.getKey(); } } return Long.valueOf(-1);
		 */
	}

	@Override
	public boolean isUserAppPrivilege(String uri) {

		Principal principal = this.getCurrentPrincipal();
		if (principal != null) {
			// 获取用户的所有权限
			List<Long> userModuleid = principal.getModuleIds();
			for (Long moduleid : userModuleid) {
				// 根据用户的权限获取系统中对应的权限
				Privilege privilege = appPrivileges.get(moduleid);
				// 匹配当前当前请求的uri是否符合当前系统权限的规则,不符合进入下一次匹配。符合则返回1;
				// 当循环结束仍未符合系统规则，则表示当前用户没有权限
				if (privilege != null && antPathMatcher.match(privilege.getUrl(), uri)) {
					return true;
				}
			}
		}
		return false;

		/*
		 * for (Map.Entry<Long, Privilege> entry : appPrivileges.entrySet()) {
		 * if (entry.getValue().getUrl().indexOf(uri) != -1) { return
		 * entry.getKey(); } } return Long.valueOf(-1);
		 */
	}

	@Override
	public Map<Long, Privilege> getOperationPrivileges() {
		return operationPrivileges;
	}

	@Override
	public Map<Long, Privilege> getWebPrivileges() {
		return webPrivileges;
	}

	@Override
	public Map<Long, Privilege> getWechatPrivileges() {
		return wechatPrivileges;
	}

	@Override
	public Map<Long, Privilege> getAppPrivileges() {
		return appPrivileges;
	}

	@Override
	public Principal getCurrentPrincipal() {
			Principal principal=(Principal) SessionManager
					.getSessionAttribute(Constants.LOGIN_CURRENT_USER);
			if(principal==null){
				principal=getCurrentPrincipalForApp();
			}
			return principal;
	}

	public Principal getCurrentPrincipalForApp() {
		RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
		if (requestAttributes != null) {
			String  userToken =((ServletRequestAttributes) requestAttributes).getRequest().getHeader("User-Token");
			if(userToken!=null){
				Principal principal=TokenCacheTimer.getUserPrincipal(userToken);
				return principal;
			}
		}

		return null;
	}



}
